<?php
/**
 * Created by PhpStorm.
 * User: huyi
 * Date: 2018/1/24
 * Time: 15:26
 */
/**
 * 在本教程中，我们将在上一节基础上添加一个功能 - 我们将实现能够*****只订阅一部分消息*****。
 * 例如，我们想能够仅将关键的错误消息保存到日志文件(以节省磁盘空间)，同时仍然能够在控制台打印所有日志消息。
 */

/**
 * 绑定
 */
/**
 * 你能回忆之前的代码：
 * $channel->queue_bind($queue_name, 'logs');
 * ***绑定***是交换机和队列之间的关系。可以简单地理解为：队列对来自绑定交换机的信息感兴趣。
 * **
 * 绑定键的含义取决于交换机的类型。上一节中我们使用的 fanout 会直接忽略它的值。
 * **
 */

/**
 * 直接交换 (Direct exchange)
 */
/**
 * 例如，我们可能希望将日志消息写入磁盘的脚本仅接收严重错误消息，而不会在警告和提示信息上面浪费磁盘空间
 */

/**
 * 我们之前使用的 fanout 类型交换机，它没有什么灵活性 - 只能广播消息。
 * 这里我们将使用 direct 交换机，直接交换背后的算法很简单 - 消息将传递到 binding key 与消息的 routing key 完全匹配的队列。
 */

/**
 * 多重绑定
 */
/**
 * 使用相同的键绑定到多个队列上是完全合法的。在上面的示例中，我们可以在X和Q1之间添加绑定 black。
 * 那样的话，direct 交换机将能如 fanout 交换机一样，在多个匹配的队列之间广播相同的消息。
 * 具有 black 路由键的消息将会被发送到Q1和Q2中。
 */

/**
 * 发出日志
 */
/**
 * 我们将使用此模型构建日志记录系统。我们将把消息发送到 direct 类型交换机上, 而不是使用 fanout类型。
 * 我们将提供日志严重性作为 routing key。
 * 这样接收消息的脚本就能够选择要接受消息的严重性进行接收。我们首先关注发送日志部分：
 * **
 * 一如以往，我们首先要建立一个交换机：
 * $channel->exchange_declare('direct_logs', 'direct', false, false, false);
 * *
 * 然后，我们准备发送信息：
 * $channel->exchange_declare('direct_logs', 'direct', false, false, false);
 * $channel->basic_publish($msg, 'direct_logs', $severity);
 */

/******************/
/**
 * 订阅
 */
/**
 * 接收消息大致和上一节教程一样，除了一个例外 - 我们将为每个我们感兴趣的消息严重性创建一个新的绑定。
 * foreach($severities as $severity) {
 * $channel->queue_bind($queue_name, 'direct_logs', $severity);
 * }
 */